package com.xhu.base;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

/**
 * 随机加密算法实现类
 * @author 王涛
 * @Created by WT on 2019/3/15.
 */
public class RND {

    /**
     * @param content  需要加密的内容
     * @param key  加密密钥，需要通过KeyManager来产生
     * @param ivspec  初始化向量
     * @return  加密后的密文
     */
    public String encrypt(String content, Key key, IvParameterSpec ivspec) {
        try {

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            // 创建密码器
            byte[] byteContent = content.getBytes("utf-8");
            // 将明文字符串类型的数据转换成字节类型，以utf-8进行编码
            cipher.init(Cipher.ENCRYPT_MODE, key, ivspec);
            // 初始化
            byte[] result = cipher.doFinal(byteContent);
            // 加密
            return Base64.encode(result);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @param content 待解密内容，数据库中的数据都是用Base64编码后的字符串
     * @param key  解密密钥
     * @param ivspec
     * @return  返回结果，以二进制表示
     */
    public byte[] decrypt(String content, Key key, IvParameterSpec ivspec) {
        try {
            byte[] byteContent = Base64.decode(content);
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            // 创建密码器
            cipher.init(Cipher.DECRYPT_MODE, key, ivspec);
            // 初始化
            byte[] result = cipher.doFinal(byteContent);
            // 加密
            return result;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (InvalidAlgorithmParameterException e) {
            e.printStackTrace();
        }
        return null;
    }
}
